// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 26.1.1
description: >
  Call target with thisArgument and argumentsList
info: |
  26.1.1 Reflect.apply ( target, thisArgument, argumentsList )

  ...
  4. Perform PrepareForTailCall().
  5. Return Call(target, thisArgument, args).
features: [Reflect]
---*/

function Test() {
    var o = {};
    var count = 0;
    var results, args;

    function fn() {
      count++;
      results = {
        thisArg: this,
        args: arguments
      };
    }

    Reflect.apply(fn, o, ['arg1', 2, , null]);

    assert.sameValue(count, 1, 'Called target once');
    assert.sameValue(results.thisArg, o, 'Called target with `o` as `this` object');
    assert.sameValue(results.args.length, 4, 'Called target with 4 arguments');
    assert.sameValue(results.args[0], 'arg1');
    assert.sameValue(results.args[1], 2);
    assert.sameValue(results.args[2], undefined);
    assert.sameValue(results.args[3], null);
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
